Vue.createApp({
	data(){
		return{
			list:[],	//格子
			current:0,	//当前等级
			levels:[	//所有的等级
				{
					name:'初级',
					row:9,
					col:9,
					count:10
				},
				{
					name:'中级',
					row:20,
					col:20,
					count:40
				},
				{
					name:'高级',
					row:30,
					col:30,
					count:90
				}
			],
			count:0	,	//显示雷的数量
			m:0,
			s:0,
			timer:null,
			isend:0
		}
	},
	created() {
		this.init()		//初始化
	},
	methods:{
		init(){
			this.s=0,this.m=0,this.isend=0
			//1.创建格子
			var level=this.levels[this.current]	//当前等级信息
			var list=[],posList=[]
			this.count=level.count
			for(let i=0;i<level.row;i++){
				list.push([])  //行
				for(let j=0;j<level.col;j++){
					let neb=[]	//当前坐标： i,j 上 右上 右 右下 下 左下 左 左上 
					neb.push({row:i-1,col:j})
					neb.push({row:i-1,col:j+1})
					neb.push({row:i,col:j+1})
					neb.push({row:i+1,col:j+1})
					neb.push({row:i+1,col:j})
					neb.push({row:i+1,col:j-1})
					neb.push({row:i,col:j-1})
					neb.push({row:i-1,col:j-1})
					list[i].push({
						value:0,	//格子的内容0-8  -1:雷
						closed:1,	//格子是否关闭
						flag:0,		//格子是否被标记
						neb:neb		//相邻格子	
					})
					posList.push({		//坐标数组
						row:i,
						col:j
					})
				}
			}
			//2.随机生成雷的坐标
			// 下标范围：0，posList.length-1
			for(let i=0;i<level.count;i++){
				let x=Math.floor(Math.random()*posList.length)
				let row=posList[x].row,
					col=posList[x].col	
				list[row][col].value=-1		//设置雷
				posList.splice(x,1)		//删除保证雷的位置不重复
			}
			//3.填数字  数相邻格子雷的数量  value=-1
			for(let i=0;i<list.length;i++){
				for(let j=0;j<list[i].length;j++){
					if(list[i][j].value != -1){		//除了雷以外
						let c=0  //计数
						list[i][j].neb.forEach(gz=>{	//循环相邻格子
							let row=gz.row,col=gz.col
							if(list[row] && list[row][col] !=undefined && list[row][col].value == -1){
								c++
							}
						})
						list[i][j].value=c
					}
				}
			}
			console.log(list)
			this.list=list
		},
		flag(col){
			//右键标记	!true  false	
			if(col.flag){	//取消
				col.flag=0
				this.count++
			}else{
				if(this.count > 0){	//标记
					col.flag=1
					this.count--
				}
			}
		},
		open(col){
			if(col.flag || this.isend) return		//标记的格子不能打开
			// 打开格子
			col.closed=0
			// 打开发现是雷,把所有的雷全部打开
			if(col.value == -1){
				this.list.forEach(item=>{
					item.forEach(gz=>{
						if(gz.value == -1){
							gz.closed=0
						}
					})
				})
				this.isend=1	//游戏结束
				clearInterval(this.timer)	//停止计时器
				alert('游戏结束')
				return
			}
			if(col.value == 0){	//空白格	  打开所有的相邻格子
				col.neb.forEach(gz=>{
					let row=gz.row,col=gz.col
					if(this.list[row] && this.list[row][col]!=undefined && this.list[row][col].closed){
						//打开格子
					this.open(this.list[row][col])	//递归	
					}
				})
			}
			this.isSuccess()
		},
		openSafe(col){	//打开安全格
			//不安全
			var neb=col.neb	//八个相邻格子
			for(let i=0;i<neb.length;i++){
				//格子是存在的	没有标记	没有打开
				let gz=this.list[neb[i].row][neb[i].col]
				if(this.isExist(neb[i]) && !gz.flag && gz.closed){
				if(gz.value == -1){
					console.log('不安全')
					return	//终止
					}
				}
			}
			console.log('安全')
			//安全  打开格子
			for(let i=0;i<neb.length;i++){
					//格子是存在的	没有标记	没有打开
					let gz=this.list[neb[i].row][neb[i].col]
					if(this.isExist(neb[i]) && !gz.flag && gz.closed){
						//调用打开格子方法
						this.open(gz)
				}
			}
		},
		isExist(gz){	//判断一个坐标是否存在
			let row=gz.row,col=gz.col
			if(this.list[row] && this.list[row][col]!=undefined){
				return true
			}
			return false
		},
		isSuccess(){
			//判断游戏是否成功
			// 翻开的格子数量+雷的数量==总的格子数
			let level=this.levels[this.current]
			let count=0	//计数
			this.list.forEach(row=>{
				row.forEach(col=>{
					if(!col.closed){	//数翻开的格子数量
						count++
					}
				})
			})			
			if(count+level.count==level.row*level.col){
				clearInterval(this.timer)	//停止计时器
				alert('恭喜你，挑战成功')
			}
		},
		setTime(){
			//计数器
			this.timer=setInterval(()=>{
				this.s++
				if(this.s >= 60){
					this.m++
					this.s=0
				}
			},1000)
		}
	}
}).mount('#app')